home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / -archivi / -recent2 / amicad_2.00.lha / AmiCAD / ARexx / ImportFile1.0 < prev    next >
Text File  |  1999-02-22  |  10KB  |  358 lines

  1. /* Chargement d'un fichier version 1.0 */
  2. /* 3 Février 1999: version 1.01 (doublage guillemets dans textes, correction DRAWMODE bus) */
  3. /* 21 février 1999: version 1.02 (modif appel REQFILE, correction routine lire_chaine ) */
  4. /* $VER: ImportFile 1.02 (© R.Florac, 21/02/99) */
  5.  
  6. options results     /* indispensable pour récupérer le résultat des macros */
  7.  
  8. signal on error     /* pour l'interception des erreurs */
  9. signal on syntax
  10.  
  11. 'VERSION(0)'
  12. if result < 2 then do
  13.     'MESSAGE("Ce script nécessite"+CHR(10)+"AmiCAD version 2")'
  14.     exit
  15. end
  16.  
  17. fichier=0
  18. 'SELSHEET(-1)'; nf=result
  19. 'OBJECTS(-1)'; objets=result
  20. if objets>0 then do
  21.     'REQUEST("Le document actuel"+CHR(10)+"contient déjà 'objets' objets"+CHR(10)+"Voulez-vous charger"+CHR(10)+"ce fichier dans une"+CHR(10)+"nouvelle fenêtre?")'
  22.     if result=1 then do
  23.     'NEW("")'
  24.     'SELSHEET(-1)'; nf=result
  25.     end
  26.     else do
  27.     'REQUEST("Voulez-vous conserver"+CHR(10)+"les objets actuels?"+CHR(10)+"Le nouveau schéma sera"+CHR(10)+"chargé par dessus.")'
  28.     if result=0 then do
  29.         'SELSHEET('nf'):MARKZONE(0,0,WWIDTH(-1)-1,WHEIGHT(-1)-1):MENU("Effacer")'
  30.     end
  31.     end
  32. end
  33.  
  34. 'REQFILE("Fichier à charger?","Travail:AmiCAD/Schémas","")'; f=result
  35. if f="" then exit
  36.  
  37. if open(fichier,f,'READ') then do
  38.     entete=lire_chaine(fichier)
  39.     if entete~="AmiCADFile 1.0" then do
  40.     if entete="AmiCADFile 1.1" then do
  41.         close(fichier)
  42.         'REQUEST("Ce fichier est au"+CHR(10)+"nouveau format!"+CHR(10)+"Voulez-vous le charger?")'
  43.         if result = 1 then 'LOAD("'f'")'
  44.         exit
  45.     end
  46.     else 'MESSAGE("Format fichier incorrect")'
  47.     close(fichier)
  48.     exit
  49.     end
  50.     'SELSHEET('nf'):WTOFRONT('nf'):FILENAME("'f'"):LOCK(-1)'
  51.     objets=0; objet=0; gmaxi=0
  52.     do until eof(fichier)
  53.     groupe=0
  54.     type=lire_octet(fichier)
  55.     largeur_trait=1
  56.     if type='FIN' then leave
  57.     if type>63 then do
  58.         if type>127 then do
  59.         groupe=1
  60.         type=type-128
  61.         end
  62.         if type>63 then do
  63.         largeur_trait=lire_octet(fichier)
  64.         type=type-64
  65.         end
  66.         else largeur_trait=1
  67.     end
  68.     if groupe~=0 then groupe=lire_valeur(fichier)
  69.     select
  70.         when type=1 then do     /* composant */
  71.         comp=lire_chaine(fichier)
  72.         circuit=lire_octet(fichier)
  73.         x0=lire_valeur(fichier)
  74.         y0=lire_valeur(fichier)
  75.         call lire_mode(fichier)
  76.         call lire_echelles(fichier)
  77.         'DRAWMODE('largeur_trait'):CONVERT(0,0):SETPINS(0,1):PUTPART("'comp'",'x0','y0')';
  78.         objet=result; composant=objet
  79.         objets=objets+1
  80.         end
  81.         when type=13 then do    /* Définition fenêtre */
  82.         lt=lire_valeur(fichier)
  83.         ht=lire_valeur(fichier)
  84.         lf=lire_valeur(fichier)
  85.         hf=lire_valeur(fichier)
  86.         xg=lire_valeur(fichier)
  87.         yh=lire_valeur(fichier)
  88.         xo=lire_valeur(fichier)
  89.         yo=lire_valeur(fichier)
  90.         'SELSHEET('nf'):DIMSHEET('lt','ht'):WINDOW('xg','yh','lf','hf'):LOCK('nf')'
  91.         end
  92.         when type=14 then do    /* Définition bibliothèque */
  93.         lib=lire_chaine(fichier)
  94.         'LOADLIB("'lib'")'
  95.         end
  96.         when type=2 then do     /* fil de liaison */
  97.         x0=lire_valeur(fichier)
  98.         y0=lire_valeur(fichier)
  99.         x1=lire_valeur(fichier)
  100.         y1=lire_valeur(fichier)
  101.         'DRAWMODE(1):DRAW('x0','y0','x1','y1')'; objet=result
  102.         objets=objets+1
  103.         end
  104.         when type=3 then do     /* arc de cercle */
  105.         'DRAWMODE('largeur_trait')'
  106.         x0=lire_valeur(fichier)
  107.         y0=lire_valeur(fichier)
  108.         rh=lire_valeur(fichier)
  109.         rv=lire_valeur(fichier)
  110.         ad=lire_valeur(fichier)
  111.         af=lire_valeur(fichier)
  112.         'ARC('x0','y0','rh','rv','ad','af')'; objet=result
  113.         objets=objets+1
  114.         end
  115.         when type=4 then do     /* texte */
  116.         'DRAWMODE('largeur_trait')'
  117.         t=lire_chaine(fichier)
  118.         x0=lire_valeur(fichier)
  119.         y0=lire_valeur(fichier)
  120.         call lire_mode(fichier)
  121.         call lire_echelles(fichier)
  122.         'WRITE("'doublage_guillemets(t)'",'x0','y0')'; objet=result
  123.         objets=objets+1
  124.         end
  125.         when type=5 then do     /* référence composant */
  126.         'DRAWMODE('largeur_trait')'
  127.         t=lire_chaine(fichier)
  128.         x0=lire_valeur(fichier)
  129.         y0=lire_valeur(fichier)
  130.         call lire_mode(fichier)
  131.         call lire_echelles(fichier)
  132.         'WRITE("'t'",'x0','y0')'; objet=result
  133.         'LINKREF('composant','objet')'
  134.         objets=objets+1
  135.         end
  136.         when type=6 then do     /* valeur composant */
  137.         'DRAWMODE('largeur_trait')'
  138.         t=lire_chaine(fichier)
  139.         x0=lire_valeur(fichier)
  140.         y0=lire_valeur(fichier)
  141.         call lire_mode(fichier)
  142.         call lire_echelles(fichier)
  143.         'WRITE("'t'",'x0','y0')'; objet=result
  144.         'LINKVAL('composant','objet')'
  145.         objets=objets+1
  146.         end
  147.         when type=23 | type=7 then do    /* connexion */
  148.         x0=lire_valeur(fichier)
  149.         y0=lire_valeur(fichier)
  150.         call lire_echelles(fichier)
  151.         if type=23 then 'CONVERT(0,1)'
  152.         else 'CONVERT(0,0)'
  153.         'JUNCTION('x0','y0')'; objet=result
  154.         objets=objets+1
  155.         end
  156.         when type=8 then do     /* pointillés */
  157.         x0=lire_valeur(fichier)
  158.         y0=lire_valeur(fichier)
  159.         x1=lire_valeur(fichier)
  160.         y1=lire_valeur(fichier)
  161.         'DRAWMODE(0):DRAW('x0','y0','x1','y1')'; objet=result
  162.         objets=objets+1
  163.         end
  164.         when type=9 then do     /* bus */
  165.         x0=lire_valeur(fichier)
  166.         y0=lire_valeur(fichier)
  167.         x1=lire_valeur(fichier)
  168.         y1=lire_valeur(fichier)
  169.         'DRAWMODE(3):DRAW('x0','y0','x1','y1')'; objet=result
  170.         objets=objets+1
  171.         end
  172.         when type=10 then do    /* ellipse */
  173.         'DRAWMODE('largeur_trait')'
  174.         x0=lire_valeur(fichier)
  175.         y0=lire_valeur(fichier)
  176.         rh=lire_valeur(fichier)
  177.         rv=lire_valeur(fichier)
  178.         'ELLIPSE('x0','y0','rh','rv')'; objet=result
  179.         objets=objets+1
  180.         end
  181.         when type=11 then do    /* connecteur entrée */
  182.         'DRAWMODE('largeur_trait')'
  183.         t=lire_chaine(fichier)
  184.         x0=lire_valeur(fichier)
  185.         y0=lire_valeur(fichier)
  186.         call lire_mode(fichier)
  187.         call lire_echelles(fichier)
  188.         'INPUT("'t'",'x0','y0')'; objet=result
  189.         objets=objets+1
  190.         end
  191.         when type=12 then do    /* connecteur de sortie */
  192.         'DRAWMODE('largeur_trait')'
  193.         t=lire_chaine(fichier)
  194.         x0=lire_valeur(fichier)
  195.         y0=lire_valeur(fichier)
  196.         call lire_mode(fichier)
  197.         call lire_echelles(fichier)
  198.         'OUTPUT("'t'",'x0','y0')'; objet=result
  199.         objets=objets+1
  200.         end
  201.         when type=15 then do    /* trait double */
  202.         'DRAWMODE(2)'
  203.         x0=lire_valeur(fichier)
  204.         y0=lire_valeur(fichier)
  205.         x1=lire_valeur(fichier)
  206.         y1=lire_valeur(fichier)
  207.         'DRAW('x0','y0','x1','y1')'; objet=result
  208.         objets=objets+1
  209.         end
  210.         when type=16 then do    /* composant sans bornes */
  211.         comp=lire_chaine(fichier)
  212.         circuit=lire_octet(fichier)
  213.         x0=lire_valeur(fichier)
  214.         y0=lire_valeur(fichier)
  215.         call lire_mode(fichier)
  216.         call lire_echelles(fichier)
  217.         'DRAWMODE('largeur_trait'):CONVERT(0,0):SETPINS(0,0):PUTPART("'comp'",'x0','y0')'; objet=result; composant=objet
  218.         objets=objets+1
  219.         end
  220.         when type=17 then do    /* définition groupe */
  221.         do 5
  222.             lt=lire_valeur(fichier)
  223.         end
  224.         end
  225.         when type=19 then do    /* NOM_SYMBOLE_ALTERNÉ */
  226.         comp=lire_chaine(fichier)
  227.         circuit=lire_octet(fichier)
  228.         x0=lire_valeur(fichier)
  229.         y0=lire_valeur(fichier)
  230.         call lire_mode(fichier)
  231.         call lire_echelles(fichier)
  232.         'DRAWMODE('largeur_trait'):CONVERT(0,1):SETPINS(0,1):PUTPART("'comp'",'x0','y0')'; objet=result; composant=objet
  233.         objets=objets+1
  234.         end
  235.         when type=20 then do    /* NOM_SYMBOLE_ALTERNÉ_SANS_BORNES */
  236.         comp=lire_chaine(fichier)
  237.         circuit=lire_octet(fichier)
  238.         x0=lire_valeur(fichier)
  239.         y0=lire_valeur(fichier)
  240.         call lire_mode(fichier)
  241.         call lire_echelles(fichier)
  242.         'DRAWMODE('largeur_trait'):CONVERT(0,1):SETPINS(0,0):PUTPART("'comp'",'x0','y0')'; objet=result; composant=objet
  243.         objets=objets+1
  244.         end
  245.         when type=21 then do    /* Trait personnalisé */
  246.         lt=lire_octet(fichier)
  247.         'DRAWMODE('0-lt')'
  248.         x0=lire_valeur(fichier)
  249.         y0=lire_valeur(fichier)
  250.         x1=lire_valeur(fichier)
  251.         y1=lire_valeur(fichier)
  252.         'DRAW('x0','y0','x1','y1')'; objet=result
  253.         objets=objets+1
  254.         end
  255.         when type=22 then do    /* boîte */
  256.         lt=lire_octet(fichier)
  257.         'DRAWMODE('0-lt')'
  258.         x0=lire_valeur(fichier)
  259.         y0=lire_valeur(fichier)
  260.         x1=lire_valeur(fichier)
  261.         y1=lire_valeur(fichier)
  262.         'BOX('x0','y0','x1','y1')'; objet=result
  263.         objets=objets+1
  264.         end
  265.         otherwise do
  266.         'MESSAGE("Donnée inconnue: 'type'")'
  267.         leave
  268.         end
  269.     end
  270.     if groupe>0 then do
  271.         if g.groupe ~= "G."||groupe then g.groupe=g.groupe||','||objet
  272.         else g.groupe=objet
  273.         if groupe>gmaxi then gmaxi=groupe
  274.     end
  275.     end
  276.     close(fichier)
  277.     'MESSAGE("Fin de fichier atteinte"+CHR(10)+"'objets' objets lus"):UNLOCK(-1)'
  278.     do i=1 to gmaxi
  279.     if g.i ~= "G."||i then 'GROUP('g.i')'
  280.     end
  281. end
  282. else 'MESSAGE("Ouverture fichier impossible")'
  283. 'UNLOCK(-1)'
  284. exit
  285.  
  286. lire_mode: procedure
  287.     parse arg fichier
  288.     mode=lire_octet(fichier)
  289.     if mode>15 then mode=mode-16
  290.     if mode>7 then mode=mode-8
  291.     if mode>3 then do
  292.     'SYMMETRY(0,1)'
  293.     mode=mode-4
  294.     end
  295.     else 'SYMMETRY(0,0)'
  296.     'ROTATE(0,'mode')'
  297.     return
  298.  
  299. lire_echelles: procedure
  300.     parse arg fichier
  301.     eh=lire_octet(fichier)*100
  302.     ev=lire_octet(fichier)*100
  303.     'SETSCALE(0,'eh','ev')'
  304.     return
  305.  
  306. lire_chaine: procedure
  307.     parse arg fichier
  308.     l=""
  309.     do forever
  310.     c=readch(fichier,1)
  311.     if c='00'x then return l
  312.     l=l||c
  313.     if eof(fichier) then return l   /* au cas où il n'y aurait pas de 0 terminal! */
  314.     end
  315.  
  316. lire_valeur: procedure
  317.     parse arg fichier
  318.     v=lire_octet(fichier)*256
  319.     v=v+lire_octet(fichier)
  320.     return v
  321.  
  322. lire_octet: procedure expose objets
  323.     parse arg fichier
  324.     c=readch(fichier,1)
  325.     if eof(fichier) then return "FIN"
  326.     v=0
  327.     if bittst(c,0) then v=1
  328.     if bittst(c,1) then v=v+2
  329.     if bittst(c,2) then v=v+4
  330.     if bittst(c,3) then v=v+8
  331.     if bittst(c,4) then v=v+16
  332.     if bittst(c,5) then v=v+32
  333.     if bittst(c,6) then v=v+64
  334.     if bittst(c,7) then v=v+128
  335.     return v
  336.  
  337. doublage_guillemets: procedure
  338.     parse arg chaine
  339.     t=''
  340.     do i=1 to length(chaine)
  341.     c = substr(chaine,i,1)
  342.     if c='"' then c=c||'"'
  343.     t=t||c
  344.     end
  345.     return t
  346.  
  347. /* Traitement des erreurs, interruption du programme */
  348. syntax:
  349. erreur=RC
  350. si (fichier) close(fichier)
  351. 'MESSAGE("Erreur de syntaxe"+CHR(10)+"en ligne 'SIGL'"+CHR(10)+"'errortext(erreur)'"):UNLOCK(-1)'
  352. exit
  353.  
  354. error:
  355. si (fichier) close(fichier)
  356. 'MESSAGE("Erreur en ligne 'SIGL'"):UNLOCK(-1)'
  357. exit
  358.